/*
 * 在路由跳转前，根据条件进行逻辑处理
 * @Author: ljb
 * @Date: 2018-08-29 15:47:32
 * @Last Modified by: ljb
 * @Last Modified time: 2019-09-05 13:34:28
 */
import store from 'src/vuex/store';
import InitData from 'src/utils/initData';
import API_LIST from 'src/API_LIST';
import Toast from 'cube-ui/lib/toast';
import { messages } from 'src/locales';

import Util from './libs/util';
import StatusManagement from './StatusManagement'; // 状态管理的类;

const lang_type = store.state.lang.current_lang || 'zh-CN';

/**
 * 解析重新登陆的参数
 * @param  {StatusManagement} status {状态管理的类}
 * @return {any} {解析好的参数或null}
 */
function parseLoginParams(status) {
	const { customer_id, scan_event_id, lang } = status;
	if (customer_id && scan_event_id) {
		return {
			customer_id,
			scan_event_id,
			language: lang || lang_type,
			phone: store.getters['login/getUserPhone'],
		};
	} // 参数
	return null;
}

/**
 * 请求H5浏览器登录的用户信息
 * @param  {StatusManagement} status {状态管理的类}
 * @return {Promise} {请求的语法糖}
 */
function fetchH5UserInfo(status) {
	const params = parseLoginParams(status);
	if (params) {
		return store.dispatch('login/loginH5User', params) // 通过获取url信息作为参数重新登陆
			.catch(() => Promise.reject(new Error('store error')));
	}
	const toast = Toast.$create({
		type: 'error',
		time: 2000,
		txt: messages[lang_type].login.argument_error,
	});
	toast.show();
	return Promise.reject(new Error('login params not found'));
}


/**
 * 收藏请求的处理逻辑
 * @param  {Object} params {收藏所需的参数}
 * @param  {function} next {路由向下执行}
 */
function handleCollectionRequest(params, next) {
	store.dispatch('collection/postCollectionAction', params)
		.then(() => next({ path: `/collection/${params.id}` }))
		.catch((err) => {
			const toast = Toast.$createToast({
				type: 'warn',
				time: 2000,
				txt: err.message || err.statusText,
			});
			toast.show();
			setTimeout(() => next({ path: '/' }), 2000);
		});
}

/**
 * 微信获取用户信息的逻辑
 * @param  {StatusManagement} status {状态管理的类}
 * @return {type} {description}
 */
function fetchWxInfo(status) {
	// 正常处于微信环境或debug模式访问时
	const param = {
		openid_url: API_LIST.WECHAT_OPENID,
		user_url: API_LIST.USER_INFO,
		jssdk_url: API_LIST.WECHAT_JSSDK,
		upload_location_url: API_LIST.USER_LOCATION,
		redirect_url: API_LIST.WECHAT_OAUTH,
		switch_lang: true,
	};

	const initClass = InitData.getInstance(param);

	if (status.isDebugMode()) { // debug模式下采用debugInit的初始化方式，不需要请求openid以及重定向
		return initClass.debugInit();
	} // 非debug模式的话，需要进行正常的init流程，请求openid -> 没有拿到则重定向 -> 请求userInfo -> 请求jssdk
	return initClass.init();
}

/**
 * 进入登录页面前的逻辑判断和处理
 * @param  {StatusManagement} status {状态管理的类}
 * @param  {function} next {路由向下执行}
 * @param user
 * @return {any|void} {?}
 */
function afterLoginFetchInfo(status, next, user) {
	// 逻辑：拥有收藏id则跳转收藏页面，默认情况下，如果没有年龄信息则跳个人信息编辑页面，反之跳个人信息主页
	if (status.hasFavorId()) {
		if (!user.openid) {
		  return;
		}

		const params = { // 收藏需要的参数
			id: status.favor_id,
			form: { openid: user.openid, scan_event_id: status.scan_event_id },
		};

		handleCollectionRequest(params, next); // 收藏请求的处理逻辑
	} else if (user.born_at || user.age) {
		next({ path: '/' });
	} else {
		next({ path: '/information' });
	}
}

/**
 * 进入登录页面前的逻辑判断和处理
 * @param  {StatusManagement} status {状态管理的类}
 * @param  {function} next {路由向下执行}
 * @return {any} {?}
 */
function handleLoginPage(status, next) {
	if (status.isAppidWxMode()) {
		// 微信环境请求用户信息
		return fetchWxInfo(status)
			.then(() => store.state.userInfo.user_info)
			.then((user) => {
				afterLoginFetchInfo(status, next, user);
			});
	}
	next();
}

/**
 * 不需要检查的路由
 * @param  {String} name {路由名}
 * @return {type} {description}
 */
function uncheckedRoute(name) {
	const unchecked_routers = [
		'lucky-money',
		'lucky-money-rankings',
		'lucky-money-records',
		'manual',
		'ipad-manual',
		'mirror-manual',
		'debug-example',
	];

	return unchecked_routers.indexOf(name) !== -1;
}

/**
 * 进入路由前的处理
 * @param  {Object} to   {下个路由对象}
 * @param  {function} next {路由跳转执行方法}
 * @return {any|Promise} {请求H5登录信息的语法糖或者undefined}
 */
const handleRouterBefore = function handleRouterBefore(to, next) {
	// reset title设置页面title
	Util.title(to.meta.title);

	// 如果访问的页面属于不需要校验的路由，或者数据初始化已经完毕的话，直接执行next方法
	if (uncheckedRoute(to.name) || store.state.userInfo.is_inited) return next();

	const status_management = StatusManagement.getInstance();// 状态管理类

	// 根据条件判断执行不同方法
	if (to.name === 'login') {
		return handleLoginPage(status_management, next); // 进入登录页面前的处理逻辑
	} else if (!status_management.isAppidWxMode() && !status_management.isDebugMode()) {
		// 当不是有appid的wx环境且不是debug模式访问时，请求登录接口获取个人信息（为了在刷新页面之后仍可以获取到用户信息）
		return fetchH5UserInfo(status_management)
			.then(() => {
				next();
			})
			.catch(() => {
				next('/');
			});
	}
	// 默认操作是微信重定向请求用户信息
	return fetchWxInfo(status_management)
		.then(() => {
			next();
		});
};

export default handleRouterBefore;
